<

ImageProvider.loadBuffer の追加

まとめ

  • ImageProviderというメソッドが追加されましたloadBufferそれが機能する 同様にloadからデコードする点を除いて、ui.ImmutableBuffer
  • ui.ImmutableBufferアセット キーから直接作成できるようになりました。
  • AssetBundleクラスがロードできるようになりましたui.ImmutableBuffer
  • PaintingBindingというメソッドが追加されましたinstantiateImageCodecFromBufferと同様に機能します。instantiateImageCodec
  • ImageProvider.load現在は非推奨となっており、将来削除される予定です リリース。
  • PaintingBinding.instantiateImageCodec現在は非推奨となっており、削除される予定です 将来のリリースで。

コンテクスト

ImageProvider.loadBufferは、次のことを行うために実装する必要がある新しいメソッドです。 画像をロードします。この API を使用すると、アセットベースの画像の読み込みを高速化できます。 アプリケーションへのメモリへの影響も少なくなります。

変更内容の説明

アセット イメージをロードする場合、以前はイメージ プロバイダー API で複数のファイルが必要でした。 圧縮されたデータのコピー。まず、アセットを開いたときのデータは、 外部ヒープにコピーされ、型付きデータ配列として Dart に公開されます。それから その型付きデータ配列は最終的にui.ImmutableBuffer、 これにより、デコードのためにデータが 2 番目の構造に内部的にコピーされます。

を追加して、ui.ImmutableBuffer.fromAsset、圧縮された画像バイトは、 デコードに使用される構造体に直接ロードできます。このアプローチを使用する のバイト読み込みパイプラインへの変更が必要ですImageProvider。このプロセス また、追加のスケジューリング オーバーヘッドをバイパスするため、高速になります。 以前のメソッドのチャネルベースのローダー。

ImageProvider.loadBufferそれ以外の場合は、と同じ契約を結んでいますImageProvider.loadただし、次のことを期待する新しいデコード コールバックを提供する点が異なります。 のui.ImmutableBufferの代わりにUint8List。ためにImageProviderクラス アセット以外の場所からバイトを取得するコンビニエンスメソッドui.ImmutableBuffer.fromUint8List互換性のために使用できます。

移行ガイド

サブクラス化するクラスImageProviderを実装する必要がありますloadBufferの方法 アセットをロードしています。のメソッドを委任する、またはメソッドを呼び出すクラスImageProvider直接使用する必要がありますloadBufferそれ以外のload

移行前のコード:

class MyImageProvider extends ImageProvider<MyImageProvider> {
  @override
  ImageStreamCompleter load(MyImageProvider key, DecoderCallback decode) {
    return MultiFrameImageStreamCompleter(
        codec: _loadData(key, decode),
    );
  }

  Future<ui.Codec> _loadData(MyImageProvider key, DecoderCallback decode) async {
    final Uint8List bytes = await bytesFromSomeApi();
    return decode(bytes);
  }
}

class MyDelegatingProvider extends ImageProvider<MyDelegatingProvider> {
  MyDelegatingProvider(this.provider);

  final ImageProvder provider;

  @override
  ImageStreamCompleter load(MyDelegatingProvider key, DecoderCallback decode) {
    return provider.load(key, decode);
  }
}

移行後のコード:

class MyImageProvider extends ImageProvider<MyImageProvider> {
  @override
  ImageStreamCompleter loadBuffer(MyImageProvider key, DecoderBufferCallback decode) {
    return MultiFrameImageStreamCompleter(
        codec: _loadData(key, decode),
    );
  }

  Future<ui.Codec> _loadData(MyImageProvider key, DecoderBufferCallback decode) async {
    final Uint8List bytes = await bytesFromSomeApi();
    final ui.ImmutableBuffer buffer = await ui.ImmutableBuffer.fromUint8List(bytes);
    return decode(buffer);
  }
}

class MyDelegatingProvider extends ImageProvider<MyDelegatingProvider> {
  MyDelegatingProvider(this.provider);

  final ImageProvder provider;

  @override
  ImageStreamCompleter loadBuffer(MyDelegatingProvider key, DecoderCallback decode) {
    return provider.loadBuffer(key, decode);
  }
}

どちらの場合も、 以前の実装ImageProvider.loadコードのユーザーにも移行する時間を与えます。

タイムライン

リリースされたバージョン: 3.1.0-0.0.pre.976
安定リリース: 3.3.0

参考文献

API ドキュメント:

  • ImmutableBuffer
  • ImageProvider

関連する PR:

  • アセット画像の読み込みには不変バッファを使用する